<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function Cat(name, color, type) {
        // 实例化对象的属性/方法
        this.name = name;
        this.color = color;
        this.type = type;

    }
    // console.dir(Cat);

    // 原型对象
    // Cat.prototype = {constructor}
    Cat.prototype.species = "Cat";
    Cat.prototype.skill = function () {
        console.log("捉老鼠");
    };
    Cat.prototype.call = function () {
        console.log("喵喵");
    };
    Cat.prototype.say = function () {
        // this -> 调用此方法的实例化对象
        console.log(this.name, this.color);
    };


    Object.prototype.a = 1;
    Object.prototype.b = 2;


    // 原型链: 实例化对象在查找属性和方法时的一个链式查找机制

    // 实例化对象自身 =>  构造函数的原型对象          =>       Object的原型对象    
    //     Tom       Cat.prototype(Tom.[[Prototype]])   Object.prototype( Cat.prototype.[[Prototype]])

    var Tom = new Cat("Tom", "black", "黑猫");
    console.log(Tom);

    // 1.自己有找自己的
    console.log(Tom.name, Tom.color);


    // 2. 自己没有 => 创建该实例化对象的构造函数的原型对象Cat.prototype
    console.log(Tom.species);
    // Tom.say();

    // 3. 如果 Cat.prototype上也没有找对应的属性和方法 => 怎么办?  => 找Object的原型对象Object.prototype
    // 构造函数的原型对象本质也是一个对象数据 (Cat.prototype = {constructor})  => 它是由上级构造函数Object创建的
    // console.log(Cat.prototype); // {constructor}
    // console.log(Cat.prototype.__proto__ === Object.prototype);

    // console.log(Tom.a, Tom.b);


    // 4. 如果 Object.prototype上也没有找对应的属性和方法  => 怎么办?
    // 构造函数的原型对象本质也是一个对象数据   (Object.prototype = {constructor})  => 它是由上级构造函数Object创建的 => 一直查找自身  => 根本停不下来 
    // 官方强制规定
    // Object.prototype的原型属性[[Prototype]] 强制指向null => 也就是说如果Object的原型对象上也找不到,不在查找 默认返回undefined

    console.log(Object.prototype);
    // console.log(Object.prototype.__proto__ === null);

    console.log(Tom.hello);

    // var obj = {};  //对象数据
    // console.log(obj.__proto__ === Object.prototype);
    // console.log(obj.constructor === Object);


</script>

</html>